#ifndef DATASOURCE_H
#define DATASOURCE_H
#include "coord.h"
#include <QDateTime>
#include "pdxp.h"
#include <map>
#include <QString>
#include "ttc_global.h"
struct RadarPos{
    uint32_t t;//量测值的时间信息,,从每天0点起算,单位微秒.
    CoordXYZ pos;//量测值的地心坐标系下的坐标
    char zt;//目标的跟踪状态
};

struct FrameInf{
    QString name;//字段名称
    QString hexByteStr;//转为16进制字符串形式的值
    QString value;//简单解析后的表示
    int size;//字段长度
};

class TTCSHARED_EXPORT DataSource
{

public:
    static double pi;
    /*均为小端型
     * GPS数据格式
     *     0~1 byte 帧发送日期，单位：天，2000-1-1为第1天
     *     2~5 byte 帧发送时间，单位：0.1ms
     *     6~9 byte GPS定位时间，单位：1ms
     *     10 byte GPS状态，0x07为异常值
     *     11~14 byte为东经，单位：e-7rad
     *     15~18 byte为纬度，单位：e-7rad
     *     19~22 byte为高度，单位：0.1m
     * BD北斗数据格式
     *     0~1 byte 帧发送日期，单位：天，2000-1-1为第一天
     *     2~5 byte 帧发送时间，单位：0.1ms
     *     6~9 byte 北斗定位时间，单位：ms
     *     10 byte 北斗IC卡状态
     *     11 byte 北斗硬件状态
     *     12 byte 北斗入站状态
     *     13~16 byte 北斗经度，单位：e-7rad，东为正
     *     17~20 byte 北斗纬度，单位：e-7rad，北为正
     *     21~24 byte 高度，单位：0.1m
     * XYZ型数据格式
     *     0~3 byte，数据绝对时，无符号整数，单位：0.1ms
     *     4~7 byte，X坐标，有符号整数，单位：0.1m
     *     8~11 byte，Y坐标，有符号整数，单位：0.1m
     *     12~15 byte，Z坐标，有符号整数，单位：0.1m
     *     16~19 byte，X速度，有符号整数。单位：0.01m/s
     *     20~23 byte，Y速度，有符号整数。单位：0.01m/s
     *     24~27 byte，Z速度，有符号整数。单位：0.01m/s
     * Radar数据格式
     *     0 byte，无符号整数，目标数
     *     1 byte，目标号1
     *     2~26 byte，目标1信息
     *         目标信息：0~3 byte，数据绝对时，整数，单位：0.1ms
     *         目标信息：4 byte，状态码，0为丢失目标
     *         目标信息：5~8 byte，速度，有符号整数，单位：0.001m/s
     *         目标信息：9~12 byte，径向距离，无符号整数，单位：0.01m
     *         目标信息：13~16 byte，方位角，有符号整数，单位：360°/2^31
     *         目标信息：17~20 byte，仰角，有符号整数，单位：360°/2^31
     *         目标信息：21 byte，方位角动态滞后修正量，有符号整数，单位：1°/2^7
     *         目标信息：22 byte，仰角动态滞后修正量，有符号整数，单位：1°/2^7
     *         目标信息：23 byte，AGC，无符号整数，单位：0.5dB
     *         目标信息：24 byte，窄带RCS，有符号整数，0.5dBm²
     *     27 byte，目标号2
     *     ......
    */
    //数据类型枚举,依接口文件数据帧定义,外测数据可分为GPS,BD(北斗),Radar(雷达)和XYZ(光电交会/综合弹道/引导数据)四类数据.
    enum Type{GPS, BD, Radar, XYZ};
    //过滤规则枚举
    enum CheckOption{Mid=1, Sid=0b10, Bid=0b100, Flag=0b1000, Reserve=0b10000};

    /*
     * @brief: 解析GPS/BD/XYZ等大地坐标系型数据，type为Radar或srcLength小于最小长度时返回false，
     *         否则将解析出的数据转换为大地直角坐标和日历时间赋予pos和t.
     * @arg: src PDXP帧中的数据段数据指针;
     *       srcLength PDXP数据段的长度(即src长度);
     *       type 数据的类型,type可以是GPS/BD/XYZ;
     *       pos 存放解析后的量测值,地心直角坐标系下坐标;
     *       t 存放点迹时间信息,单位微秒,注意:XYZ型数据无日期信息,t会存距当天0点累计的微秒数.
     * @rerurn: 如果成功解析数据帧,则返回true,否则返回false.
     */
    static bool resolvePdxpData(const char *src, int srcLength, Type type, CoordXYZ *pos, int64_t *t);

    //解析Radar等站心坐标系型数据，需要站点经纬坐标local，雷达数据包含多目标，目标位置存储于posMap中，key值为目标号，value值包含坐标和时间，坐标转换为大地直角坐标。

    /*
     * @brief: 解析雷达型的PDXP帧数据.
     * @arg: src PDXP帧中的数据段数据指针;
     *       srcLength PDXP数据段的长度(即src长度);
     *       local 雷达的站址坐标,地理坐标系;
     *       posMap 存放雷达数据帧中的目标量测信息.
     * @return: 如果成功解析雷达数据帧,返回true并向posMap中填入量测值,否则返回false.
     */
    static bool resolveRadarData(const char *src, int srcLength, const CoordLBH &local, std::map<unsigned char,RadarPos> *posMap);

    /*
     * @brief: 解析PDXP帧数据段的各字段值,并作简要解析,将解析结果存入infList中.
     * @arg: src PDXP数据段数据;
     *       length: src的长度;
     *       type: PDXP帧数据段的类型,可以是GPS/BD/XYZ/Radar;
     *       infList: 存放PDXP帧的解析结果.
     * @return: 如果解析成功,则返回true并将结果存入infList中,否则返回false,infList中结果将不可信.
     */
    static bool resolvePdxpFrame(const char *src, int length, Type type, QList<FrameInf> &infList);

    //option为判断规则，head为pdxp报文的头部信息，匹配返回true，否则返回false。
    /*
     * @brief: 根据判断选项option判断PDXP帧头head是否与自己的相符.
     * @arg: option 判断选项,须通过CheckOption指定;
     *       head 要判断的PDXP帧头.
     * @return: 如果相符,返回true,否则返回false.
     */
    bool isSourceData(int option, const PdxpHead &head);

    DataSource();


    unsigned short mid;//任务代号,详见接口文件
    unsigned int sid;//信源
    unsigned int bid;//信息标志
    unsigned char flag;//信息处理标志
    unsigned int reserve;//保留字段
    QString name;//数据名称
    CoordLBH local;//站址
    Type type;//数据的类型
};

#endif // DATASOURCE_H
